﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace SurvivalCav
{
   public class Mapa
    {
       private Objeto2D imagemTiles;
       private Rectangle[] tileFrames;
       private Tile[,] tiles;
       private int linhas;
       private int colunas;
       private int tileAltura;
       private int tileLargura;

       private const int TIPO_NAO_ANDAVEL = 0;

       public Mapa(int linhas, int colunas, int tileLargura, int tileAltura)
       {
           this.linhas = linhas;
           this.colunas = colunas;
           this.tileLargura = tileLargura;
           this.tileAltura = tileAltura;
           this.tiles = new Tile[linhas, colunas];
       }

       public void loadContent(ContentManager content, string filename)
       {
           this.imagemTiles = new Objeto2D(content.Load<Texture2D>("tiles"));
       }

       public void GerarTileFrames()
       {
           int tileSprite = (this.imagemTiles.Width / this.tileLargura) * (this.imagemTiles.Height / this.tileAltura);
           this.tileFrames = new Rectangle[tileSprite];
           int indice = 0;
           int width = this.imagemTiles.Width;
           int height = this.imagemTiles.Height;

           for (int i = 0; i < width; i += this.tileLargura)
           {
               for (int j = 0; j < height; j += this.tileAltura)
               {
                   this.tileFrames[indice] = new Rectangle(i, j, this.tileLargura, this.tileAltura);
                   indice++;
               }
           }
       
       }

       public void carregarMapa(int[,] matriz)
       {
           if (matriz.GetLength(0) != this.tiles.GetLength(0) || matriz.GetLength(1) != this.tiles.GetLength(1))
           {
               throw new Exception("Matriz não possui a mesma dimensão do Mapa");
           }
           if (this.imagemTiles == null)
           {
               throw new Exception("imagem do mapa não foi carregada");
           }
           this.GerarTileFrames();

           int x = 0;
           int y = 0;
           int tipo = 1;
           bool andavel = true;

           for (int i = 0; i < this.linhas; i++)
           {
               for (int j = 0; j < this.colunas; j++)
               {
                   tipo = matriz[i, j];
                   if (tipo < 0 || tipo > this.tileFrames.Length)
                   {
                       throw new Exception("tipo de tile inválido");
                   }
                   else
                   {
                       if (tipo == TIPO_NAO_ANDAVEL)
                           andavel = false;

                       this.tiles[i, j] = new Tile(tipo, andavel, x, y, this.tileLargura, this.tileAltura);

                   }
                   x += this.tileLargura;
               }
               x = 0;
               y += this.tileAltura;
           }

       }

       public void Draw(SpriteBatch batch)
       {
           for (int i = 0; i < this.linhas; i++)
           {
               for (int j = 0; j < this.colunas; j++)
               {
                   Rectangle destino = new Rectangle(
                       this.tiles[i, j].Retangulo.X,
                       this.tiles[i, j].Retangulo.Y,
                       this.tileLargura,
                       this.tileAltura);

                   int frame = this.tiles[i, j].Tipo;

                   batch.Draw(this.imagemTiles, destino, this.tileFrames[frame], Color.White);
               }
           }
       }
    }
}
